package IHM;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.StyledEditorKit;

import Metier.Theme;

/**
 * Classe gerant la barre d'outils ( gras, italique, etc.. )
 * @author Aubry Thomas
 * @author Bouchet Sylvain
 * @author Fauvel Alexis
 * @author Lessieur Jocelyn
 * @author Mathias Bastien 
 * @author Teuf Antoine
 * @version 1.0
 */
public class ToolBar extends JPanel implements ActionListener{
	
	/**
	 * Barre d'outils contenant les differents boutons de mise en forme
	 */
	private JToolBar toolbar;
	
	/**
	 * Bouton d'alignement à gauche
	 */
	private JButton btn_align_left;
	
	/**
	 * Bouton d'aligment au centre
	 */
	private JButton btn_align_center;
	
	/**
	 * Bouton d'aligment à droite
	 */
	private JButton btn_align_right;
	
	/**
	 * Bouton d'aligment justifié
	 */
	private JButton btn_align_justified;
	
	/**
	 * bouton permetant la mise en gras du texte
	 * @see ToolBar#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_gras;
	
	/**
	 * bouton permetant la mise en italique du texte
	 * @see ToolBar#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_italique;
	
	/***
	 * bouton permetant le soulignage du texte
	 * @see ToolBar#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_souligne;
	
	/**
	 * bouton permetant de barré le texte
	 * @see ToolBar#setToggle(boolean, boolean, boolean, boolean)
	 */
	private JToggleButton btn_barre;
	
	/**
	 * bouton permetant d'ajouter une image
	 */
	private JButton btn_ajout_img;
	
	/**
	 * bouton permetant d'ajouter un titre
	 */
	private JButton btn_ajout_titre;

	private JButton btn_ajout_sstitre;
	
	/**
	 * bouton permetant d'ajouter un lien
	 */
	private JButton btn_ajout_lien;
	
	/**
	 * bouton permetant d'ajouter le paragraphe saisie
	 */
	private JButton btn_ajout;
	
	/**
	 * bouton permetant de choisir le theme du projet
	 */
	private JButton btn_choix_theme;
	
	/**
	 * bouton permetant de choisir un theme personnel
	 */
	private JButton btn_modif_theme;
	
	/**
	 * Label permetant d'afficher le nom du theme selectionné
	 * @see ToolBar#getTheme()
	 * @see ToolBar#majThemeActuel()
	 */
	private JLabel nomTheme;
	
	/**
	 * L'instance de la ZoneTexte de l'application, permetant de faire le lien entre les boutons et la zone de saisie
	 */
	private ZoneTexte text;
	
	/**
	 * L'instance de l'IHM de l'application
	 * @see ToolBar#getIhm()
	 */
	private IHM ihm;

	/**
	 * Constructeur de la toolBar
	 * @param texte	l'instance de la zone de texte
	 * @param ihm	l'instance de lihm
	 */
	public ToolBar(ZoneTexte texte, IHM ihm) {
		/* creation de la toolbar */
		this.ihm = ihm;
		this.text = texte;
		toolbar = new JToolBar();
		toolbar.setFloatable(false);

		/* Partie des ajouts*/
		JLabel ajout=new JLabel("Ajouter :");
		toolbar.add(ajout);
		toolbar.addSeparator();
		
		/* ajout d'une image */
		btn_ajout_img = new JButton("Image");
		btn_ajout_img.setToolTipText("Ajouter une image au site");
		btn_ajout_img.addActionListener(this);
		toolbar.add(btn_ajout_img);
		
		/* ajout d'une titre */
		btn_ajout_titre = new JButton("Titre");
		btn_ajout_titre.setToolTipText("Ajouter un titre au site");
		btn_ajout_titre.addActionListener(this);
		toolbar.add(btn_ajout_titre);
	
		/* ajout d'une sous-titre */
		btn_ajout_sstitre = new JButton("Sous-Titre");
		btn_ajout_sstitre.setToolTipText("Ajouter un sous-titre au site");
		btn_ajout_sstitre.addActionListener(this);
		toolbar.add(btn_ajout_sstitre);
		
		/* ajout de lien */
		btn_ajout_lien = new JButton("Lien");
		btn_ajout_lien.setToolTipText("Ajouter un lien vers une adresse internet ou vers un fichier que vous ajouterez au site.");
		btn_ajout_lien.addActionListener(this);
		toolbar.add(btn_ajout_lien);
		
		toolbar.addSeparator(new Dimension(30,0));
		
		
		/* Partie paragraphe */
		JLabel lab_paragraphe=new JLabel("Paragraphe : ");
		toolbar.add(lab_paragraphe);
		/* Misee en forme */
		/* Alignement */
		/* Gauche */
		btn_align_left = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_LEFT)); // creer le bouton
		btn_align_left.setToolTipText("alignement à gauche"); // Definie l'intitule du bouton
		btn_align_left.setIcon(new ImageIcon(getClass().getResource("/images/align_left.png"))); // ajoute une icone sur le bouton
		btn_align_left.addActionListener(this);
		toolbar.add(btn_align_left); // ajoute le bouton
		
		/* centrer */
		btn_align_center = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_CENTER));
		btn_align_center.setToolTipText("alignement centrer");
		btn_align_center.setIcon(new ImageIcon(getClass().getResource("/images/align_center.png")));
		btn_align_center.addActionListener(this);
		toolbar.add(btn_align_center);
		
		/* Droite */
		btn_align_right = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_RIGHT));
		btn_align_right.setToolTipText("alignement à droite");
		btn_align_right.setIcon(new ImageIcon(getClass().getResource("/images/align_right.png")));
		btn_align_right.addActionListener(this);
		toolbar.add(btn_align_right);
		
		/* Justifi� */
		btn_align_justified = new JButton(new StyledEditorKit.AlignmentAction("", StyleConstants.ALIGN_JUSTIFIED));
		btn_align_justified.setToolTipText("alignement justifié");
		btn_align_justified.setIcon(new ImageIcon(getClass().getResource("/images/align_justified.png")));
		btn_align_justified.addActionListener(this);
		toolbar.add(btn_align_justified);

		toolbar.addSeparator();

		/* Mise en forme ( Gras / italique / soulign� / barr� ) */
		/* Gras */
		btn_gras = new JToggleButton(new StyledEditorKit.BoldAction());
		btn_gras.setText("");
		btn_gras.setToolTipText("Gras");
		btn_gras.setIcon(new ImageIcon(getClass().getResource("/images/gras.png")));
		btn_gras.addActionListener(this);
		// btn_gras.addActionListener(this);
		toolbar.add(btn_gras);
		/* italique */
		btn_italique = new JToggleButton(new StyledEditorKit.ItalicAction());
		btn_italique.setText("");
		btn_italique.setToolTipText("Italique");
		btn_italique.setIcon(new ImageIcon(getClass().getResource("/images/italique.png")));
		btn_italique.addActionListener(this);
		toolbar.add(btn_italique);
		/* soulign� */
		btn_souligne = new JToggleButton(new StyledEditorKit.UnderlineAction());
		btn_souligne.setText("");
		btn_souligne.setToolTipText("Souligné");
		btn_souligne.setIcon(new ImageIcon(getClass().getResource("/images/souligne.png")));
		btn_souligne.addActionListener(this);
		toolbar.add(btn_souligne);
		/* barr� */
		btn_barre = new JToggleButton(new StrikeThroughAction());
		btn_barre.setToolTipText("Barré");
		btn_barre.setIcon(new ImageIcon(getClass().getResource("/images/barre.png")));
		btn_barre.addActionListener(this);
		toolbar.add(btn_barre);

		toolbar.addSeparator();

		/* Ajout du Bouton ajout */
		btn_ajout = new JButton("Ajouter");
		btn_ajout.setToolTipText("Ajouter le paragraphe au site");
		btn_ajout.addActionListener(this);
		toolbar.add(btn_ajout);
		
		toolbar.addSeparator(new Dimension(30,0));
		
		/* Partie toolbar qui concerne les themes */
		JLabel lab=new JLabel("Thème du projet : ");
		if(ihm.getControleur().getProjetEnCours() == null )
			nomTheme=new JLabel("Pas de thème");
		else
			nomTheme=new JLabel(getTheme().toString());//nom du theme actuel
		
		btn_choix_theme=new JButton(new ImageIcon(getClass().getResource("/images/choixTheme.png")));
		btn_choix_theme.addActionListener(this);
		btn_choix_theme.setToolTipText("Changer de Thème");
		
		btn_modif_theme=new JButton(new ImageIcon(getClass().getResource("/images/modifTheme.png")));
		btn_modif_theme.addActionListener(this);
		btn_modif_theme.setToolTipText("Personnaliser le Thème");
		
		toolbar.add(lab);
		toolbar.add(nomTheme);
		toolbar.addSeparator();
		toolbar.add(btn_choix_theme);
		toolbar.add(btn_modif_theme);
		
		toolbar.addSeparator(new Dimension(30,0));
		
		//toolbar visible et mise en place
		add(toolbar);
		activerBtnParagraphe(false);
		setVisible(true);
		

	}
	
	/**
	 * Permet d'activer ou non les boutons liés au paragraphe
	 * @param b	vrai(true) pour les activer sinon faux(false)
	 */
	public void activerBtnParagraphe(boolean b){
		btn_align_center.setEnabled(b);
		btn_align_justified.setEnabled(b);
		btn_align_left.setEnabled(b);
		btn_align_right.setEnabled(b);
		btn_gras.setEnabled(b);
		btn_italique.setEnabled(b);
		btn_souligne.setEnabled(b);
		btn_barre.setEnabled(b);
		btn_ajout.setEnabled(b);
	}

	/* Actions li�es aux differents boutons */
	public void actionPerformed(ActionEvent e) {
		ihm.setInfo(""); //Pour vider la barre d'info quand on fait pas d'action 'particulières'
		
		if(ihm.getControleur().getProjetEnCours() != null && ihm.getVisu().getPage()!=null) {
			if (e.getSource() == btn_ajout) {
				ihm.getControleur().getProjetEnCours().getPageEnCours().insererParagraphe(SerialClone.clone(text.getdoc()));
				remiseZero();
				activerBtnParagraphe(false);
				ihm.getArborescence().requestFocus();
				ihm.majVisu();
			}
			else if(e.getSource()==btn_ajout_img){
				String nomFichier = new String();
				String dir = new String();
				JFileChooser fc = new JFileChooser();
				FileNameExtensionFilter filter = new FileNameExtensionFilter("Images JPG, GIF & PNG","png","jpg","jpeg","gif");
				fc.setFileFilter(filter);
	
				int rVal = fc.showOpenDialog(ihm);
				if (rVal == JFileChooser.APPROVE_OPTION) {
					File image=fc.getSelectedFile();
					ImageIcon img=new ImageIcon(image.getPath());
					ihm.getControleur().getProjetEnCours().getPageEnCours().insererImage(image.getPath());
				}
				fc.setVisible(true);
				
				ihm.majVisu();
			}
			else if(e.getSource()==btn_ajout_lien)
				new FenetreInsertLien(ihm);			
			else if(e.getSource()==btn_choix_theme){
				new FenetreChoixTheme(this);
			}
			else if(e.getSource()==btn_ajout_sstitre){
				new FenetreSaisie("Sous-titre",ihm);
			}
			else if(e.getSource()==btn_ajout_titre){
				new FenetreSaisie("Titre",ihm);
			}
			else if(e.getSource()==btn_modif_theme){
				new FenetrePersoTheme(this);
			}
			else{
				text.getJTextPane().requestFocus();
			}
	
		} else {
			if(ihm.getVisu().getPage()==null)
				ihm.setInfo("Aucune page sélectionnée !");
		}
	}
	
	/***
	 * Permet de recuperer le theme en cours dans la toolBar
	 * @return l'instance du theme en cours
	 */
	public Theme getTheme(){
		if(ihm.getControleur().getProjetEnCours() == null)
			return null;
		else
			return ihm.getControleur().getProjetEnCours().getTheme();
	}
	
	/**
	 * Permet de recuperer l'IHM
	 * @return	l'instance de l'ihm
	 */
	public IHM getIhm(){
		return ihm;
	}
	
	/**
	 * Permet de faire une mise a jour du theme actuel dans la toolBar
	 */
	public void majThemeActuel(){
		nomTheme.setText(ihm.getControleur().getProjetEnCours().getTheme().toString());
	}
	
	/**
	 * Permet de mettre a jour la position des boutons de mise en forme
	 * @param gras		vrai(true) si texte en gras
	 * @param italique	vrai(true) si texte en italique
	 * @param souligne	vrai(true) si texte en souligne
	 * @param barre		vrai(true) si texte en barre
	 */
	public void setToggle(boolean gras,boolean italique,boolean souligne,boolean barre){
		btn_gras.setSelected(gras);
		btn_italique.setSelected(italique);
		btn_souligne.setSelected(souligne);
		btn_barre.setSelected(barre);
	}
	
	public void remiseZero(){
		btn_align_left.doClick();
		text.setText("zero");
		StyledDocument doc=text.getdoc();
		
		if(StyleConstants.isBold(doc.getCharacterElement(1).getAttributes())) 			btn_gras.doClick();
		if(StyleConstants.isItalic(doc.getCharacterElement(1).getAttributes())) 		btn_italique.doClick();
		if(StyleConstants.isUnderline(doc.getCharacterElement(1).getAttributes()))		btn_souligne.doClick();
		if(StyleConstants.isStrikeThrough(doc.getCharacterElement(1).getAttributes()))	btn_barre.doClick();
		
		text.setText("");
		text.setCommentaire(true);
	}
}
